﻿using System;
using System.Globalization;
using System.Threading;

//CÁC HÀM HỖ TRỢ CHO KIỂU SỐ
namespace Project.MVC.Web.Helper
{
    public class NumberHelper
    {   
        // "1,2,3,4"  -> int[1,2,3,4]
        public static int[] ConvertToIntArray(string str)
        {
            if (str != null)
            {
                var count = Count(str);
                var list = new int[count];
                str = str + ",";
                for (var i = 0; i <= count - 1; i++)
                {
                    list[i] = Convert.ToInt32(str.Substring(0, str.IndexOf(",")));
                    str = str.Substring(str.IndexOf(',') + 1, str.Length - (str.IndexOf(',') + 1));
                }

                return list;
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// Làm tròn theo cấu hình hệ thống
        /// </summary>
        /// <param name="number">Số cần làm tròn</param>
        /// <returns></returns>
        public static double Round(double? number)
        {
            if (number == 0) return 0;
            var value = Math.Pow(10, AppConfigModel.CurrencyFormat);
            if (number != null)
            {
                //LÀM TRÒN THEO CẤU HÌNH HỆ THỐNG
                number /= value;
                number = Math.Round((double)number, 0) * value;
            }
            return number != null ? (double)number : 0;
        }

        public static int Count(string str)
        {
            var i = 0;
            int index, length;
            while ((str.Length > 0) && (str.Contains(",")))
            {
                i++;
                index = str.IndexOf(',') + 1;
                length = str.Length - index;
                str = str.Substring(index, length);
            }
            return i + 1;
        }

        /// <summary>
        /// Chuyển chuổi sang kiểu double
        /// </summary>
        /// <param name="str">Chuỗi ký tự</param>
        /// <param name="groupingSymbol">Ký hiệu tách nhóm</param>
        /// <param name="decimalSymbol">Ký hiệu thập phân</param>
        /// <returns>Giá trị kiểu Double</returns>
        public static double ConvertToDouble(string str, string groupingSymbol, string decimalSymbol)
        {
            //if(!String.IsNullOrEmpty(str))
            //{
            //    str = str.Replace(groupingSymbol, "");
            //    str = str.Replace(decimalSymbol, ".");
            //    return Convert.ToDouble(str);
            //}
            //else
            //{
            //    return 0;
            //}

            var curentNumberDecimalSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator;
            var curentNumberGroupSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator;
            
            double value;

            var someCulture = new CultureInfo("vi-VN")
                                  {
                                      NumberFormat =
                                          {
                                              NumberDecimalSeparator = decimalSymbol,
                                              NumberGroupSeparator = groupingSymbol
                                          }
                                  };

            Thread.CurrentThread.CurrentCulture = someCulture;
            try
            {
                if (double.TryParse(str, out value))
                {
                    return value;
                }
                else
                {
                    return 0;
                }
            }
            finally
            {
                someCulture = new CultureInfo("vi-VN")
                {
                    NumberFormat =
                    {
                        NumberDecimalSeparator = curentNumberDecimalSeparator,
                        NumberGroupSeparator = curentNumberGroupSeparator
                    }
                };
                Thread.CurrentThread.CurrentCulture = someCulture;
            }
        }

        /// <summary>
        /// Chuyển chuổi sang kiểu Integer
        /// </summary>
        /// <param name="str">Chuỗi ký tự</param>
        /// <param name="groupingSymbol">Ký hiệu tách nhóm</param>
        /// <param name="decimalSymbol">Ký hiệu thập phân</param>
        /// <returns>Giá trị kiểu Integer</returns>
        public static int ConvertToInt(string str, string groupingSymbol, string decimalSymbol)
        {
            //if (!String.IsNullOrEmpty(str))
            //{
            //    str = str.Replace(groupingSymbol, "");
            //    str = str.Replace(decimalSymbol, ".");
            //    return Convert.ToInt32(str);
            //}
            //else
            //{
            //    return 0;
            //}
           

            var curentNumberDecimalSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator;
            var curentNumberGroupSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator;
            double value;

            var someCulture = new CultureInfo("vi-VN")
            {
                NumberFormat =
                {
                    NumberDecimalSeparator = decimalSymbol,
                    NumberGroupSeparator = groupingSymbol,
                    CurrencyDecimalDigits = 0 
                }
            };

            Thread.CurrentThread.CurrentCulture = someCulture;
            try
            {
                if (double.TryParse(str, out value))
                {
                    return (int)value;
                }
                else
                {
                    return 0;
                }
            }
            finally
            {
                someCulture = new CultureInfo("vi-VN")
                {
                    NumberFormat =
                    {
                        NumberDecimalSeparator = curentNumberDecimalSeparator,
                        NumberGroupSeparator = curentNumberGroupSeparator
                    }
                };
                Thread.CurrentThread.CurrentCulture = someCulture;
            }
        }


    }
}
